package 多线程; // 定义包名

public class notifyAndNotifyAll { // 定义类，用于演示notify和notifyAll方法
    
    static Object lock = new Object(); // 定义一个静态对象作为锁

    public static void main(String[] args) throws InterruptedException{ // 主方法，程序的入口
        
        Thread t1 = new Thread(() -> { // 创建第一个线程
            synchronized(lock){ // 同步块，使用lock对象作为锁
                System.out.println(Thread.currentThread().getName() + "...wating..."); // 输出线程1等待信息
                try {
                    lock.wait(); // 线程1等待
                } catch (InterruptedException e) { // 捕获中断异常
                    e.printStackTrace(); // 打印异常堆栈
                }
                System.out.println(Thread.currentThread().getName() + "...wake up..."); // 输出线程1唤醒信息
            }
        }, "t1"); // 线程1的名称

        Thread t2 = new Thread(() -> { // 创建第二个线程
            synchronized(lock){ // 同步块，使用lock对象作为锁
                System.out.println(Thread.currentThread().getName() + "...wating..."); // 输出线程2等待信息
                try {
                    lock.wait(); // 线程2等待
                } catch (InterruptedException e) { // 捕获中断异常
                    e.printStackTrace(); // 打印异常堆栈
                }
                System.out.println(Thread.currentThread().getName() + "...wake up..."); // 输出线程2唤醒信息
            }
        }, "t2"); // 线程2的名称

        t1.start(); // 启动线程1
        t2.start(); // 启动线程2

        Thread.sleep(2000); // 主线程休眠2秒

        synchronized(lock){ // 同步块，使用lock对象作为锁
            // lock.notify(); // 随机唤醒一个等待的线程
            lock.notifyAll(); // 唤醒所有等待的线程
        }
    }
}
